home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / mint / netlib / lib / recvmsg.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-12-27  |  1.3 KB  |  69 lines

  1. /*
  2.  *    recvmsg() emulation for MiNT-Net, (w) '93, kay roemer
  3.  */
  4.  
  5. #include "socklib.h"
  6. #ifdef KERNEL
  7. #undef UNX2DOS
  8. #include "kerbind.h"
  9. #else
  10. #include <mintbind.h>
  11. #endif
  12. #include "sys/socket.h"
  13. #include "mintsock.h"
  14.  
  15. #ifdef UNX2DOS
  16. #include "sys/un.h"
  17. #define UN_OFFSET    ((short)((struct sockaddr_un *)0)->sun_path)
  18. #endif
  19.  
  20. #ifndef KERNEL
  21. extern int errno;
  22. #endif
  23.  
  24. int
  25. recvmsg (fd, msg, flags)
  26.     int fd;
  27.     struct msghdr *msg;
  28.     int flags;
  29. {
  30.     struct recvmsg_cmd cmd;
  31.     int r;
  32. #ifdef UNX2DOS
  33.     struct sockaddr_un *unp = (struct sockaddr_un *)msg->msg_name;
  34.     _SIZE_T oaddrlen = msg->msg_namelen;
  35. #endif
  36.  
  37.     cmd.cmd = RECVMSG_CMD;
  38.     cmd.msg = msg;
  39.     cmd.flags = flags;
  40.  
  41. #ifdef KERNEL
  42.     r = f_cntl (fd, (long)&cmd, SOCKETCALL);
  43. #else
  44.     r = Fcntl (fd, (long)&cmd, SOCKETCALL);
  45. #endif
  46.     
  47. #ifdef UNX2DOS
  48.     if (unp && unp->sun_family == AF_UNIX && r >= 0) {
  49.         char name[sizeof (unp->sun_path)];
  50.         extern int _dos2unx (const char *, char *);
  51.         extern int _sncpy (char *, const char *, _SIZE_T);
  52.         
  53.         if (msg->msg_namelen > UN_OFFSET) {
  54.             _dos2unx (unp->sun_path, name);
  55.             msg->msg_namelen = UN_OFFSET + _sncpy (unp->sun_path,
  56.                 name, oaddrlen - UN_OFFSET);
  57.         }
  58.     }
  59. #endif
  60.  
  61. #ifndef KERNEL
  62.     if (r < 0) {
  63.         errno = -r;
  64.         return -1;
  65.     }
  66. #endif
  67.     return r;
  68. }
  69.